﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using RzCorportativo.DataAccess;

namespace RzCorportativo.Lib
{
    public class Atestado
    {
        private RzCorportativo.DataAccess.Atestado model;
        public int AtestadoId { get; set; }
        public int PacienteId { get; set; }
        public int MedicoId { get; set; }
        public Consulta Consulta { get; set; }
        public DateTime Data { get; set; }
        public short Periodo { get; set; }
        public TipoIntervalo TipoIntervalo { get; set; }
        public bool IsNew { get { return this.AtestadoId == 0; } }

        public static Lib.Atestado CreateInstace(int atestadoId)
        {
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            var p = db.Atestado.Where(w => w.AtestadoId == atestadoId).FirstOrDefault();
            Atestado item = new Atestado();
            if (p != null)
                item = item.CreateAtestado(p);
            return item;
        }

        public bool Salvar()
        {
            bool @result = false;
            Transaction.Begin((entity) =>
            {
                this.model = new RzCorportativo.DataAccess.Atestado();
                if (this.IsNew)
                    this.model = this.Insert(entity);
                else
                    this.model = this.Update(entity);
                return true;
            }).OnError((ex) =>
            {
                @result = false;
            }).OnSuccess(() =>
            {
                @result = true;
                this.AtestadoId = this.model.AtestadoId;
            });
            return @result;
        }

        private RzCorportativo.DataAccess.Atestado Insert(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            entity.AddToAtestado(@item);
            return @item;
        }

        private RzCorportativo.DataAccess.Atestado Update(RZCorporativoEntities entity)
        {
            var @item = this.CreateModel(entity);
            return @item;
        }

        private RzCorportativo.DataAccess.Atestado CreateModel(RZCorporativoEntities entity)
        {
            RzCorportativo.DataAccess.Atestado atestado = new RzCorportativo.DataAccess.Atestado();
            if (!this.IsNew)
            {
                atestado = entity.Atestado.Where(w => w.AtestadoId == this.AtestadoId).FirstOrDefault();
                if (atestado == null)
                    throw new Exception("Código inválido");
            }

            atestado.AtestadoId = this.AtestadoId;
            atestado.ConsultaId = this.Consulta.ConsultaId;
            atestado.Data = this.Data;
            atestado.Periodo = this.Periodo;
            atestado.TipoPeriodo = (short)this.TipoIntervalo;
            atestado.MedicoId = this.MedicoId;
            atestado.PacienteId = this.PacienteId;
            return atestado;
        }

        internal Atestado CreateAtestado(RzCorportativo.DataAccess.Atestado item)
        {
            Atestado atestado = new Atestado();
            atestado.AtestadoId = item.AtestadoId;
            if (item.Consultas != null)
            {
                atestado.Consulta = new Consulta()
                {
                    ConsultaId = item.ConsultaId
                };
                atestado.Consulta.Paciente = atestado.Consulta.Paciente.CreatePasciente(item.Consultas.Pacientes);
                atestado.Consulta.Medico = new Medico().CreateMedico(item.Consultas.Medico);
            }
            atestado.Periodo = item.Periodo;
            atestado.MedicoId = item.MedicoId;
            atestado.PacienteId = item.PacienteId ?? item.PacienteId.Value;
            atestado.Data = item.Data;
            atestado.TipoIntervalo = (Lib.TipoIntervalo)item.TipoPeriodo;
            return atestado;
        }

        public static List<Atestado> Listar(Atestado atestado)
        {
            if (atestado == null)
                atestado = new Atestado();
            List<Atestado> triagens = new List<Atestado>();
            RzCorportativo.DataAccess.RZCorporativoEntities db = new RZCorporativoEntities();
            bool hasConsulta = atestado.Consulta != null;
            triagens = db.Atestado.Where(w =>
                    ((atestado.AtestadoId == 0) || (atestado.AtestadoId == w.AtestadoId)) &&
                    ((hasConsulta && atestado.Consulta.ConsultaId == 0) || (atestado.Consulta.ConsultaId == w.ConsultaId))
                ).ToList().Select(s => atestado.CreateAtestado(s)).ToList();
            return triagens;
        }
    }
}
